home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSRC.LZH
/
CDRC__.C
< prev
next >
Wrap
Text File
|
1995-03-20
|
7KB
|
252 lines
#include "_TNB.c"
#define UNchar unsigned char
#define UNint unsigned int
extern short SCSI_ID;
extern short CddevSw; //0: SCSI直接 1:計測IOCTRL
extern short CddDrvNo; //計測IOCTRL用ドライヴNO
/********************
常駐部
*********************/
/*------------------------------*/
/* 構造体 */
/*------------------------------*/
typedef struct {
int fg; /* 状態 0x11 演奏中,0x12 演奏中断 */
int track_no; /* 曲番号 */ /* 曲番号 ind*0x10000+track */
int time; /* 現在の演奏時間 */
int address; /* 演奏アドレス */
int track_long; /* 演奏中の曲のながさ*/
} PLYINF;
/**************************************
低レベルルーチン
**************************************/
/*******************************
REZEROUNITコマンドを送る
********************************/
int ZeroUnit()
{
return( scsi_rezerounit(SCSI_ID) );
}
/*******************************
ストップコマンドを送る
********************************/
int StpDsk()
{
static unsigned char com[]={0x4b,0,0,0,0, 0,0,0,0,0, 0};
unsigned char buf[16];
return( scsi_cmd( 10, com, 0, buf ) );
}
/*******************************
Resume コマンドを送る
********************************/
int Resume()
{
static unsigned char com[]={0x4b,0,0,0,0, 0,0,0,1,0, 0};
unsigned char buf[16];
return( scsi_cmd( 10, com, 0, buf ) );
}
/********************************
演奏状態を調べる
*********************************/
int ChkPly( PLYINF *plyinf )
{
static unsigned char com[]={
/* Read Sub-Channel Command */
0x42, /* Read Sub-Channel Command */
0x02, /* Set MSF Bit */
0x40, /* Set SubQ Bit */
0x01, /* CD-ROM Current Posision */
0,
0,
0,
0,
16, /* Allocation Length */
0,
0
};
unsigned char buf[32];
if ( CddevSw==0 ){ //0: SCSI直接 1:計測IOCTRL
if ( scsi_cmd( 10,com, 16, buf )!=0 )
return(-1);
plyinf->fg = buf[1]&0x1F; /* 状態 */
plyinf->track_no = buf[6] + buf[7]*0x10000; /* 曲番号 ind*0x10000+track */
plyinf->time = buf[13] * 0x10000 + buf[14] * 0x100 + buf[15];
plyinf->address = buf[9] * 0x10000 + buf[10] * 0x100 + buf[11];
} else {
cdd_ioctrl(0x8004,buf);
if ( buf[0]==0 && buf[1]==0 )/*CD入っていないらしい*/
return(-1);
else if ( buf[0]==0 && buf[1]==1 )
plyinf->fg = 0x11;
else if ( buf[0]==1 && buf[1]==1 && buf[2]==1 && buf[4]!=0 && buf[5]!=0 )
plyinf->fg = 0x12;
else
plyinf->fg = 0x15;
plyinf->track_no = buf[2] + buf[3]*0x10000; /* 曲番号 ind*0x10000+track */
plyinf->time = buf[4] * 0x10000 + buf[5] * 0x100 + buf[6];
plyinf->address = buf[8] * 0x10000 + buf[9] * 0x100 + buf[10];
}
return(0);
}
/*********************************
演奏させる
*********************************/
int PlyDsk( int start , int stop )
{
/* Play Audio MSF Command */
unsigned char buf[32];
if ( CddevSw==0 ){ //0: SCSI直接 1:計測IOCTRL
buf[0] = 0x47; /* Play Audio MSF Command */
buf[1]=0;
buf[2]=0;
buf[3] = ( start / 0x10000 ) & 0xff;
buf[4] = ( start / 0x100 ) & 0xff;
buf[5] = start & 0xff;
buf[6] = ( stop / 0x10000 ) & 0xff;
buf[7] = ( stop / 0x100 ) & 0xff;
buf[8] = stop & 0xff;
buf[9]=0;
return( scsi_cmd( 10, buf, 0, buf ) );
} else {
buf[0] = ( start / 0x10000 ) & 0xff;
buf[1] = ( start / 0x100 ) & 0xff;
buf[2] = start & 0xff;
buf[3] = 0;
buf[4] = ( stop / 0x10000 ) & 0xff;
buf[5] = ( stop / 0x100 ) & 0xff;
buf[6] = stop & 0xff;
buf[7] = 0;
cdd_ioctrl(0x8001,buf);
return( 0 );
}
}
/***********************************
曲数と最終演奏アドレスを求める
************************************/
int RedTOC(int *leadout_address, int *min_, int *max_)
{
static unsigned char com[]={
/* Leadout Track Address get & Min. Max Track get */
0x43, /* scsi2 ReadTOC Command */
0x02, /* Set MSF Bit */
0,
0,
0,
0,
0xaa, /* LeadoutOut Track */
0,
12, /* Allocation Length */
0
};
unsigned char buf[512];//足りるはず
if ( CddevSw==0 ){ //0: SCSI直接 1:計測IOCTRL
if( scsi_cmd( 10, com, 12, buf )!=0 )
return(-1);
*leadout_address = buf[9] * 0x10000 + buf[10] * 0x100 + buf[11];
*min_ = buf[2]; /* Min. Track */
*max_ = buf[3]; /* Max. Track */
} else {
cdd_ioctrl(0x8000,buf);
*leadout_address = buf[2] * 0x10000 + buf[3] * 0x100 + buf[4];
*min_ = buf[0]; /* Min. Track */
*max_ = buf[1]; /* Max. Track */
}
return(0);
}
/*************************************
演奏アドレスを求める
***************************************/
int Music_inf( int Track_no, int *start_address )
{
int rc,i;
static unsigned char com[]={
/* Start Track Address get */
0x43, /* scsi2 ReadTOC Command */
0x02, /* Set MSF Bit */
0,
0,
0,
0,
00, /* Set Start Track */
0,
12, /* Allocation Length */
0
};
unsigned char buf[512]; //足りるはず
if ( CddevSw==0 ){ //0: SCSI直接 1:計測IOCTRL
com[6] = (UNchar)Track_no; /* Set Start Track */
if( scsi_cmd( 10, com, 12, buf ) != 0 )
return(-1);
*start_address = buf[9] * 0x10000 + buf[10] * 0x100 + buf[11];
if ( (buf[5]&0b0100)!=0 )//データだ
*(UNint*)start_address |= (UNint)0x80000000;
} else {
cdd_ioctrl(0x8000,buf);
i=(Track_no-1)*4+6;
*start_address = buf[i] * 0x10000 + buf[i+1] * 0x100 + buf[i+2];
if ( buf[i+3]!=0 )//データだ
*(UNint*)start_address |= (UNint)0x80000000;
}
return(0);
}
/*++++++++++*/
int Music_inf_all( int min,int max,int *lst ) //int buf[100];
{
int rc,i,t;
unsigned char buf[512]; //足りるはず
if ( CddevSw==0 ){ //0: SCSI直接 1:計測IOCTRL
for(t=min;t<=max;t++){
if ( Music_inf( t,&lst[t] )!=0 )
return(-1);
}
} else {
cdd_ioctrl(0x8000,buf);
for(t=min;t<=max;t++){
i=(t-1)*4+6;
lst[t]= buf[i] * 0x10000 + buf[i+1] * 0x100 + buf[i+2];
if ( buf[i+3]!=0 )//データだ
(UNint)lst[t] |= (UNint)0x80000000;
}
}
return(0);
}
/*************************************
CD-ROM接続チェック
[戻り値] 0:OK
-1:
***************************************/
int CDROM_chk()
{
int i;
unsigned char buf[100];
/* 装置動作可能かチェックする */
/* メディアチェック */
if( scsi_inquiry( 0x24, SCSI_ID, (struct _inquiry *)buf ) == 0 ){
if( buf[0] != 0x05 ){
//puts("指定された SCSI-ID の装置は、CD-ROM ではない。\n\r");
return(-1);
}
/* 装置動作可能かチェック */
if( scsi_testunit(SCSI_ID) == 0 ){
//puts("OK! 1\n\r");
return(0);
} else
if( scsi_testunit(SCSI_ID) == 0 ){
//puts("OK! 2\n\r");
return(0);
} else
if( scsi_testunit(SCSI_ID) == 0 ){
//puts("OK! 3\n\r");
return(0);
} else
{
//puts("指定された CD-ROM が準備されていません。\n\r");
return(-2);
}
}
//puts("指定された SCSI-ID の装置は、現在動作不可能です。\n\r");
return(-3);
}